<?
# SimpleGraph v0.1, July 22 2007
# Requires PHP >= 4, distributable under the GNU GPL v2
# Requires GD library installed;
# PHP Class created by Black Monkey Media (http://www.blackmonkeymedia.com)
# Any questions with this script should be sent to cadenza39[at]hotmail{dot}com or development[at]blackmonkeymedia[dot]com
# Updates will be available at http://www.blackmonkeymedia.com/code/
# construct takes array with bar height,bar name, maxHeight ( if 0 maxHeight always set at 500 point above the highest bar) 
# bar width is constant for now and image width will stretch according to # of bars
# bar color will change on every refresh

///////////////// 
//CLASS CALL
  //THIS SETS VALUE OF EACH BAR
# $bars = array(500,657,1209,2000,1110,569);
  //THIS SETS NAME OF EACH BAR
# $barNames = array('JAN','FEB','MAR','APR','MAY','JUN');
# $myChart =& new Chart();
# $myChart->construct($bars,$barNames,0,'SimpleGraph by BMM');
# $myChart->displayChart();

class chart {
    var $image;
    var $imageWidth;
    var $imageHeight;
    var $chartMaxIndicator;
    var $chartName;
    var $numberOfBars;
    var $barBetweenGap;
    var $barColor;
    var $barShadeColor;
    var $barHeight = array();
    var $barName = array();
    var $barWidth;
    var $chartDisplayArea;
    var $chartInfoArea;
    var $increment;
    
    function chart(){
    	
    }
    
    function construct($barHeight,$barName,$maxHeight,$chartName){
        $this->chartName = $chartName;
        $this->chartMaxIndicator=$this->setMaxIndicator($barHeight,$maxHeight);
        //DISTANCE BETWEEN BARS
        $this->barBetweenGap=15;
        //# OF BARS WILL AFFECT IMAGE WIDTH;
        $this->numberOfBars = count($barHeight);
        //IMAGE HEIGHT IS CONSTANT VALUE;
        $this->imageHeight=200;
        //SIZE OF INFO AREA;
        $this->chartInfoArea=50;
        //BAR WIDTH IS CONSTANT VALUE;
        $this->barWidth=50;
        //SET IMAGE WIDTH;
        $this->imageWidth = (($this->barBetweenGap) + $this->barWidth) * $this->numberOfBars + $this->barBetweenGap + $this->chartInfoArea;
        //SET CHART DISPLAY AREA
        $this->chartDisplayArea=$this->imageWidth-$this->chartInfoArea;
        //SET BAR HEIGHT;
        for($a=0;$a<$this->numberOfBars;$a++){
            $this->barHeight[$a]=$barHeight[$a];
            $this->barName[$a]=$barName[$a];
        }
        $this->buildImage();
        $this->drawHorisontalLines();
        $this->drawVerticalLines();
        $this->displayBars();
        $this->displayImageFrame();
    }
    //CALCULATES MAX INDICATOR
    function setMaxIndicator($barHeight,$maxHeight){
        if($maxHeight < 1){
            $size = count($barHeight);
            $testValue=0;
            for($a=0;$a<$size;$a++){
                if($barHeight[$a]>$testValue)
                {
                    $testValue=$barHeight[$a];
                }
            }
            $returnValue = ceil($testValue*1.3);
        }else{
            $returnValue = $maxHeight;
        }
        return $returnValue;
    }
            
    //FUNCTION CREATES IMAGE WITH BACKGOUND
    function buildImage(){
        $this->image = imagecreate($this->imageWidth,$this->imageHeight);
        //SET BG COLOR
        $bgcolor = imagecolorallocate($this->image,240,240,250);
        $framecolor = imagecolorallocate($this->image,0,0,0);
        ImageFill($this->image,0,0,$bgcolor);
        ImageRectangle($this->image,0,0,$this->imageWidth-1,$this->imageHeight-1,$framecolor);
    }
    //DRAW BACKGROUND GRID 
    //FUNCTION DRAWS HORISONTAL LINES
    function drawHorisontalLines(){
        $this->increment = ($this->imageHeight/100)*10; //
        $startingHeight = $this->imageHeight;
        //SET COLOR FOR 5 HORISONTAL LINES
        $lightblue = imageColorAllocate($this->image,211,211,211);
        while($startingHeight>0){
            
            $y=$startingHeight;
            imageline($this->image,0,$y,$this->chartDisplayArea,$y,$lightblue);
            $startingHeight-=$this->increment;
        }
        $this->drawHorisontalIndicatingLines();
    
    }
    //DRAW 5 HORISONTAL INDICATOR LINES
    function drawHorisontalIndicatingLines(){
        $increment = ($this->imageHeight/100)*20; //
        $infoIncrement = intval(($this->chartMaxIndicator/100)*20);
        $infoIndicator=0;
        $startingHeight = $this->imageHeight;
        //SET COLOR FOR 5 HORISONTAL LINES AND NUMBERS
        $gridColor = imageColorAllocate($this->image,119,136,153);
        $fontColor=imageColorAllocate($this->image,119,136,153);
        while($startingHeight>0){
            
            $y=$startingHeight;
            imageline($this->image,0,$y,$this->chartDisplayArea,$y,$gridColor);
            imagestring($this->image,1,$this->chartDisplayArea+10,$y-2,$infoIndicator,$fontColor);
            $startingHeight-=$increment;
            $infoIndicator+=$infoIncrement;
        }
        imagestring($this->image,1,$this->chartDisplayArea+10,5,$this->chartMaxIndicator,$fontColor);
    }
    function drawVerticalLines(){
        $startingWidth = $this->chartDisplayArea;
        //SET COLOR FOR HORISONTAL LINES
        $lightblue = imageColorAllocate($this->image,211,211,211);
        while($startingWidth>0){
            
            $x=$startingWidth;
            imageline($this->image,$x,0,$x,$this->imageHeight,$lightblue);
            $startingWidth-=$this->increment;
        }
    
    }
    
    function displayBars(){
        //SET COORDINATES FOR FIRST BAR
        $xTop = $this->barBetweenGap;
        $yBottom = $this->imageHeight;
        $xBottom=$xTop+$this->barWidth;
        $fontColor = imageColorAllocate($this->image,0,0,0);
        //SET X TOP COORDINATES FOR NUMBER WITHIN BAR
        

        //CREATE BARS
        for($a=0;$a<$this->numberOfBars;$a++){
            
            $yTop = $this->imageHeight-(ceil(($this->imageHeight/100)*ceil(($this->barHeight[$a]/$this->chartMaxIndicator)*100)));
            $barColor = &$this->generateBarColor();
            //3D EFFECT
            for($b=1;$b<5;$b++){
                ImageFilledRectangle($this->image,$xTop,($yTop+$b),($xBottom+$b),$yBottom,$barColor[1]);
            }
            $strXtop=$this->calculatePosition($this->barWidth,$this->barHeight[$a]);
            ImageFilledRectangle($this->image,$xTop,$yTop,$xBottom,$yBottom,$barColor[0]);
            imagestring($this->image,2,$xTop+$strXtop,$yTop+5,$this->barHeight[$a],$fontColor);
            imagestring($this->image,2,$xTop,$yTop-17,$this->barName[$a],$fontColor);
            //SET COORDINATES FOR NEXT BAR
            $xTop += $this->barWidth+$this->barBetweenGap;
            $xBottom=$xTop+$this->barWidth;
        }
    }
    function generateBarColor(){
        /*$color1=(rand()%254);
        $color2=(rand()%254);
        $color3=(rand()%254);*/
        $color1=(rand(150,240));
        $color2=(rand(150,240));
        $color3=(rand(150,240));
        //LIGHT COLORS FOR 3D EFFECT
        $lightcolor1=$color1+10;
        $lightcolor2=$color2+5;
        $lightcolor3=$color3+5;
        $maincolor = imagecolorallocate($this->image,$color1,$color2,$color3);
        $lightcolor = imagecolorallocate($this->image,$lightcolor1,$lightcolor2,$lightcolor3);
        return array(&$maincolor,&$lightcolor);
    
    }
     function displayImageFrame(){
         $framecolor = imagecolorallocate($this->image,0,0,0);
        $fontColor = imageColorAllocate($this->image,119,136,153);
        $xTop = $this->calculatePosition($this->chartDisplayArea,$this->chartName);
         ImageRectangle($this->image,0,0,$this->imageWidth-1,$this->imageHeight-1,$framecolor);
        imagestring($this->image,2,$xTop,5,$this->chartName,$fontColor);
    }
    
    function displayChart(){
        header("Content-type: image/png");
        ImagePng($this->image);
        ImageDestroy($this->image);
    }
    
    function calculatePosition($sectionWidth,$string){
        $chars = strlen($string);
        $start = ($sectionWidth/2)-(strlen($string)+5);
        return $start;
    }
    
}
?>